package com.cnap.model.application;

import cn.hutool.core.util.IdUtil;
import com.cnap.db.entity.ApplicationPO;
import com.cnap.model.file.FileInitReq;
import com.cnap.model.validator.EnumCheck;
import com.cnap.utils.CommonUtils;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;

/**
 * 应用上传模型
 *
 * @author xc
 **/
@ApiModel
public class ApplicationDTO {
    // 应用名称
    @ApiModelProperty(value = "应用名称")
    @NotBlank
    private String applicationName;
    // 分类
    @ApiModelProperty(value = "分类")
    @NotNull(message = "分类名称不能为null")
    @EnumCheck(enumClass = CategoryEnum.class, message = "分类类型校验错误")
    private String category;
    // 二级分类
    @ApiModelProperty(value = "二级分类")
    @EnumCheck(enumClass = CategoryTypeEnum.class, message = "二级分类类型校验错误")
    private String type;
    // 版本
    @ApiModelProperty(value = "版本")
    @NotBlank
    private String version;
    // 描述
    @ApiModelProperty(value = "描述")
    @Length(min = 0, max = 100)
    private String description;
    // 用户名称
    @ApiModelProperty(value = "用户名")
    private String userName;
    // 标签
    @ApiModelProperty(value = "标签")
    private ApplicationLabel label;
    // 文件初始化请求
    @JsonProperty(value = "fileInfo")
    @NotNull
    @ApiModelProperty(value = "文件请求")
    private FileInitReq fileInitReq;

    private DeployResourceInfo deployResourceInfo;

    /**
     * get
     *
     * @return DeployResourceInfo
     */
    public DeployResourceInfo getDeployResourceInfo() {
        return deployResourceInfo;
    }

    /**
     * set
     *
     * @param deployResourceInfo deployResourceInfo
     */
    public void setDeployResourceInfo(DeployResourceInfo deployResourceInfo) {
        this.deployResourceInfo = deployResourceInfo;
    }

    /**
     * 获取应用名称
     *
     * @return 名称
     */
    public String getApplicationName() {
        return applicationName;
    }

    /**
     * 设置应用名称
     *
     * @param applicationName 应用名称
     */
    public void setApplicationName(String applicationName) {
        this.applicationName = applicationName;
    }

    /**
     * 获取分类
     *
     * @return 分类
     */
    public String getCategory() {
        return category;
    }

    /**
     * 设置分类
     *
     * @param category 分类
     */
    public void setCategory(String category) {
        this.category = category;
    }

    /**
     * 获取二级分类
     *
     * @return 二级分类
     */
    public String getType() {
        return type;
    }

    /**
     * 设置二级分类
     *
     * @param type 二级分类
     */
    public void setType(String type) {
        this.type = type;
    }

    /**
     * 获取版本
     *
     * @return 版本
     */
    public String getVersion() {
        return version;
    }

    /**
     * 设置版本
     *
     * @param version 版本
     */
    public void setVersion(String version) {
        this.version = version;
    }

    /**
     * 获取描述
     *
     * @return 描述
     */
    public String getDescription() {
        return description;
    }

    /**
     * 设置描述
     *
     * @param description 描述
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * 获取文件信息
     *
     * @return 文件信息
     */
    public FileInitReq getFileInitReq() {
        return fileInitReq;
    }

    /**
     * 设置文件信息
     *
     * @param fileInitReq 文件信息
     */
    public void setFileInitReq(FileInitReq fileInitReq) {
        this.fileInitReq = fileInitReq;
    }

    /**
     * 获取用户名
     *
     * @return 用户名
     */
    public String getUserName() {
        return userName;
    }

    /**
     * 设置用户名称
     *
     * @param userName 用户名
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }

    /**
     * 获取标签
     *
     * @return 标签
     */
    public ApplicationLabel getLabel() {
        return label;
    }

    /**
     * 设置标签
     *
     * @param label 标签
     */
    public void setLabel(ApplicationLabel label) {
        this.label = label;
    }

    @Override
    public String toString() {
        return "ApplicationDTO{" +
                "applicationName='" + applicationName + '\'' +
                ", category='" + category + '\'' +
                ", type='" + type + '\'' +
                ", version='" + version + '\'' +
                ", description='" + description + '\'' +
                ", userName='" + userName + '\'' +
                ", label=" + label +
                ", fileInitReq=" + fileInitReq +
                '}';
    }

    /**
     * 转换成po
     *
     * @return po
     */
    public ApplicationPO toPO() {
        ApplicationPO applicationPO = new ApplicationPO();
        applicationPO.setId(IdUtil.simpleUUID());
        applicationPO.setCategory(this.category);
        applicationPO.setType(this.type);
        applicationPO.setName(this.applicationName);
        // 前端使用的大小是byte，所以/1024后计算
        applicationPO.setSize(CommonUtils.getPrintSize(this.fileInitReq.getTotalSize() / 1024));
        applicationPO.setVersion(this.version);
        applicationPO.setUpdateTime(LocalDateTime.now());
        applicationPO.setUserName(this.userName);
        applicationPO.setDescription(this.description);
        applicationPO.setLabel(this.label);

        applicationPO.setDeployResourceInfo(this.deployResourceInfo);

        return applicationPO;
    }
}
